package com.pokermind.repository.dao;

import com.pokermind.model.po.PokerUser;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * PokerUser DAO接口
 * 定义用户相关的数据访问操作
 * 
 * @author PokerMind Team
 */
public interface PokerUserDao extends BaseDao<PokerUser, Long> {
    
    /**
     * 根据前端玩家ID查找用户
     * @param playerId 前端玩家ID（如 mp_player_004）
     * @return 用户对象，如果不存在返回empty
     */
    Optional<PokerUser> findByPlayerId(String playerId);
    
    /**
     * 检查前端玩家ID是否存在
     * @param playerId 前端玩家ID（如 mp_player_004）
     * @return true如果存在，false如果不存在
     */
    boolean existsByPlayerId(String playerId);
    
    /**
     * 查找活跃用户（在指定时间之后有更新的用户）
     * @param since 时间节点
     * @return 活跃用户列表
     */
    List<PokerUser> findActiveUsersSince(Long since);
    
    /**
     * 根据盈利排序获取用户列表
     * @param limit 返回数量限制
     * @return 按盈利排序的用户列表
     */
    List<PokerUser> findTopUsersByProfit(int limit);
    
    /**
     * 根据手数排序获取用户列表
     * @param limit 返回数量限制
     * @return 按手数排序的用户列表
     */
    List<PokerUser> findTopUsersByHands(int limit);
    
    /**
     * 更新用户统计信息
     * @param userId 用户ID
     * @param handsIncrement 手数增量
     * @param profitIncrement 盈利增量
     * @return 更新的行数
     */
    int updateUserStats(Long userId, int handsIncrement, java.math.BigDecimal profitIncrement);
    
    /**
     * 查找需要更新行为数据的用户
     * @param hours 小时数，查找超过此时间未更新的用户
     * @return 需要更新行为数据的用户列表
     */
    List<PokerUser> findUsersNeedingBehaviorUpdate(int hours);
    
    /**
     * 批量更新行为数据
     * @param userId 用户ID
     * @param vpipRate VPIP率
     * @param aggressionLevel 进攻水平
     * @param winRate 胜率
     * @param playingStyle 玩牌风格
     * @param recentForm 最近状态
     * @return 更新的行数
     */
    int updateBehaviorData(Long userId, java.math.BigDecimal vpipRate, 
                          String aggressionLevel, java.math.BigDecimal winRate,
                          String playingStyle, String recentForm);
}